<?php  
//使用接口（interface），可以指定某个类必须实现哪些方法，但不需要定义这些方法的具体内容。
//接口中定义的所有方法都必须是公有，这是接口的特性。
//要实现一个接口，使用 implements 操作符。类中必须实现接口中定义的所有方法，否则会报一个致命错误。类可以实现多个接口，用逗号来分隔多个接口的名称

 interface iSite {
  // public var $food;//接口只能定义方法，不能定义属性
  public function eating();

 }


 /**
 * 任何一个类，如果它里面至少有一个方法是被声明为抽象的，那么这个类就必须被声明为抽象的。
定义为抽象的类不能被实例化。
 抽象类可以定义属性
 继承一个抽象类的时候，子类"必须"定义父类中的所有抽象方法；另外，这些方法的访问控制必须和父类中一样（或者更为宽松）
 */
 abstract class SiteAbstract 	
 {
 	 var $abstructVar = "<br>我是抽象属性abstructVar<br>";
 	 abstract function siteAbstructFunc();

 	 function getNoAbstractDes(){
        echo "<br>","我是抽象类的非抽象方法",__METHOD__,"<br>";
 	 }


 }



  /**
  * PHP 不支持多继承
  如果从父类继承的方法不能满足子类的需求，可以对其进行改写，这个过程叫方法的覆盖（override

  public（公有）：公有的类成员可以在任何地方被访问。
  protected（受保护）：受保护的类成员则可以被其自身以及其子类和父类访问。
  private（私有）：私有的类成员则只能被其定义所在的类访问。

  PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为 final，则子类无法覆盖该方法。如果一个类被声明为 final，则不能被继承

  PHP 不会在子类的构造方法中自动的调用父类的构造方法。要执行父类的构造方法，需要在子类的构造方法中调用 parent::__construct() 。
  */
  //扩展写在前面，接口写在后面
  class Site   extends SiteAbstract implements iSite 
  {
    const constant = "我是常量";//在定义和使用常量的时候不需要使用 $ 符号。常量的值必须是一个定值，不能是变量，类属性，数学运算的结果或函数调用.用类名调用常量
    
    /*
      静态属性和const属性区别
      1>静态属性调用是用类名再加“$”符号 ＝》self::$staticVar,而常量不需要"$"符号
      2>常量不可改变,,, 静态属性可以改变
    */
    static $staticVar = "<br>staticVar<br>";
    static function staticFunc () {
    	echo "<br>","我是静态方法",__METHOD__,"<br>";
    }

     var $url;
     var $title;
//PHP 5 允行开发者在一个类中定义一个方法作为构造函数，语法格式如下
     function __construct () {

     	$this->url = "http";
     	$this->title = "Site";
     	echo "初始化完成".PHP_EOL."<br>";
     }

    //php没有为属性设置set和get方法
     function setUrl($url) {
        echo "我是Url";
     	$this -> url = $url;
     }  	
     function getUrl () {
     	return $this -> url;
     }

     function  setTitle($title) {
    	$this -> title = $title;
    }
//     变量 $this 代表自身的对象。
//     PHP_EOL 为换行符
     function getTitle () {
     	echo $this->title . PHP_EOL."T"."<br>";
     	return $this -> title;
     }

	function eating () {

     echo "我是interface定义的方法".__FUNCTION__."<br>";

	}
	function printConst(){
		//self表示当前类，parent代表父类
		echo "<br>",self::constant,__METHOD__,"<br>";
	}
   function siteAbstructFunc () {
    echo "我是抽象方法".__FUNCTION__."<br>";

   }
 //析构函数(destructor)与构造函数相反，当对象结束其生命周期时（例如对象所在的函数已调用完毕），系统自动执行析构函数
    function __destruct() {
    	echo "<br>","释放",__CLASS__,"<br>";
    }

  }
  









?>